﻿using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Xml;
using System.Xml.Serialization;
using System.IO;
using System.Reflection;
using System.Xml.Schema;
using Qas.CommonLogic.BusinessObjects;

namespace Qas.CommonLogic
{
    /// <summary>
    /// Преобразователь данных, обеспечивающий связь между объектной и xml моделями
    /// </summary>
    public static class DataMapper
    {
        /// <summary>
        /// Xml-настройки для работы XmlValidationReader'а
        /// </summary>
        private static readonly XmlReaderSettings settings =
          new XmlReaderSettings();

        /// <summary>
        /// Местный Serializer
        /// </summary>
        private static readonly XmlSerializer serializer =
          new XmlSerializer(typeof(Base));

        /// <summary>
        /// Загрузка базы из XML-файла
        /// </summary>
        /// <param name="path">Путь к файлу</param>
        /// <returns>База</returns>
        public static Base LoadBaseFromXml(string path)
        {
            if (string.IsNullOrEmpty(path))
                throw new NullReferenceException();

            using (Stream file = File.OpenRead(path))
            {
                using (XmlReader reader = XmlReader.Create(file, settings))
                {
                    return (Base)serializer.Deserialize(reader);
                }

            }
        }

        public static void SaveBaseToXml(string path, Base baseToSave)
        {
            if (string.IsNullOrEmpty(path))
                throw new NullReferenceException();

            using (XmlWriter writer = XmlWriter.Create(path))
            {
                serializer.Serialize(writer, baseToSave);
            }

        }
    }
}














//private const string taskXmlElementName = "Task1";
//private const string conditionsListXmlElementName = "TaskList";
//private const string tasksListXmlElementName = "TaskList1";
//private const string conditionXmlElementName = "Task";

//private TasksList tasksList = null;
//private ConditionsList conditionsList = null;

///// <summary>
///// Возвращает первый найденный xml-элемент по имени тега
///// </summary>
///// <param name="document">Документ, в котором осуществляется поиск</param>
///// <param name="elementName">Имя искомого тэга</param>        
//private XmlElement GetElement(XmlDocument document, string elementName)
//{
//    if (document == null) throw new NullReferenceException();
//    if (String.IsNullOrEmpty(elementName)) throw new NullReferenceException();

//    XmlNodeList foundedElements = document.GetElementsByTagName(conditionsListXmlElementName);
//    if ((foundedElements == null) || (foundedElements.Count == 0))
//    {
//        throw new NullReferenceException();
//    }
//    else
//    {
//        if ((foundedElements.Count == 1) && (foundedElements[0] as XmlElement != null))
//        {
//            return foundedElements[0] as XmlElement;
//        }
//        else
//        {
//            throw new NullReferenceException();
//        }
//    }
//}

//public DataMapper(XmlDocument xmlDocument)
//{
//    // Берём список узлов, вложенных в корень xml-документа (качество кода - паршивое)
//    XmlNodeList listOfNodes = xmlDocument.ChildNodes[1].ChildNodes;

//    this.conditionsList = new ConditionsList(
//        this.GetElement(xmlDocument, conditionsListXmlElementName));

//    //this.tasksList = new TasksList(
//    //    this.GetElement(xmlDocument, tasksListXmlElementName));

//}

//private DomainObject CreateObject(XmlElement xmlElement)
//{
//    if (xmlElement == null)
//        throw new NullReferenceException("Null-ссылка на XmlElement");

//    // Создаём объект, соответствующий данному xmlElement'у (на основании имени xml-тэга)
//    switch (xmlElement.Name)
//    {
//        case taskXmlElementName: return new Task(xmlElement);
//        case conditionXmlElementName: return new Condition(xmlElement);
//        case conditionsListXmlElementName: return new ConditionsList(xmlElement);
//        case tasksListXmlElementName: return new TasksList(xmlElement);
//    }

//    // Если мы не смогли сопоставить данному xml-элементу объект, возвращаем null
//    return null;
//}

//public TasksList AvailableTasks
//{
//    get { return this.tasksList; }
//}

//public ConditionsList AvailableConditions
//{
//    get { return this.conditionsList; }
//}